import { ref, UnwrapRef } from 'vue';
import { ResultData } from '@/utils/http';

interface IUseAsyncRequestOptions<T> {
	/** 是否立即执行 */
	immediate?: boolean;
	/** 初始化数据 */
	initialData?: T;
}
/**
 * 异步请求钩子函数
 *
 * @param func 异步请求函数，返回一个 Promise 对象，该对象解析为 ResultData<T> 类型的数据
 * @param options 请求选项，默认为 { immediate: false }
 * @param options.immediate 是否立即执行请求，默认为false
 * @param options.initialData 初始化数据，默认为undefined
 * @returns 包含 loading、error、data 和 run 方法的对象
 */
export default function useAsyncRequest<T>(
	func: () => Promise<ResultData<T>>,
	options: IUseAsyncRequestOptions<T> = { immediate: false }
) {
	const loading = ref(false);
	const error = ref<Error | null>(null);
	const data = ref<T>(options.initialData);

	const run = async () => {
		loading.value = true;
		try {
			const res = await func();
			data.value = res.data as UnwrapRef<T>;
			return data.value;
		} catch (err) {
			error.value = err;
			return null; 
		} finally {
			loading.value = false;
		}
	};

	options.immediate && run();

	return { loading, error, data, run };
}
